//操作文件夹
let fs =require('fs');
let path =require('path')
//1.读取文件夹read，特点：返回的是一个数组，数组中是当前目录的第一层文件或文件夹

// 同步:参数:'文件夹路径'
// console.log( fs.readdirSync('./src'));
// 异步:参数:'文件夹路径',回调函数
fs.readdir('./src',(err,files)=>{//err是报错信息，files是读取结果
    if(err) throw err;//抛出错误
    console.log(files);//[ 'a', 'a.js' ]
})


//2.删除文件夹 '文件夹路径'，回调函数，删除目录要为空才行
fs.rmdir('./dist',err=>{
    if(err) throw err;//抛出错误
    console.log('删除成功');
})


// 3.创建文件夹 '文件夹路径'，回调函数
fs.mkdir('./dist',err=>{
    if(err) throw err;//抛出错误
    console.log('创建成功');
})



//4.检测/获取文件信息：stat statSync access accessSync existsSync（只有existsSync有返回值，布尔类型）

// 同步 isFile()检测是否是文件 isDirectory()检测是否是文件夹
let stat=fs.statSync('./demo.txt');
console.log(stat.isFile());//true
console.log(stat.isDirectory());//false打印是否是文件夹如果是个文件的话，返回false

// 异步 '文件路径'，回调函数
fs.stat('./demo.txt',(err,stats)=>{//err是报错信息，stats是读取结果
    if(err) throw err;
    console.log(stats.isFile());
    console.log(stats.isDirectory());
})

// access
//异步
fs.access('./demo1.txt',err=>{
    if(err) throw err;
    console.log('该文件存在');
})
//同步,没有返回值 undefined
console.log( fs.accessSync('./demo.txt'));

// existsSync 同步 判断文件是否存在; 异步在node的新版本已经被废弃 
console.log( fs.existsSync('./demo.txt'));//true



//5.流操作 :适用于传输大文件，传输快
// createReadStream createWriteStream pipe
let rs=fs.createReadStream('./src/a.js');//创建可读流
let ws=fs.createWriteStream('./src/b.js');//创建写入文件流
console.time();//经过了多长时间

rs.pipe(ws);//写入文件通过pipe管道读取



//6.递归删除文件
const delDir=(filepath)=>{
    // console.log(filepath);
    const result=fs.readdirSync(filepath);//读取文件夹
    // console.log(result);
        result.forEach(item=>{
            let newp=path.join(filepath, item);//拼接路径，item是一个字符串，并不是一个路径，所以需要拼接
            // console.log(newp);
            if(path.extname(newp)){//如果有后缀的话，就是文件
                fs.unlinkSync(newp);//删除文件
            }else{
                delDir(newp);//递归调用
            }
        })
    fs.rmdirSync(filepath);//删除文件夹
  
}
delDir('./src')